#include "TaskQueue.h"

TaskQueue::TaskQueue(size_t capacity)
    :_capacity(capacity)
    ,_que()
    ,_mutex()
    ,_notFull()
    ,_notEmpty()
{

}

TaskQueue::~TaskQueue(){}

//生产者
void TaskQueue::push(int value){
    //01 加锁
    unique_lock<mutex> ul(_mutex);
    //02 判断_que有没有满
    while(full()){
        //满了就让生产者wait
        _notFull.wait(ul);
    
    }
    //没满就push+唤醒消费者
    _que.push(value);
    _notEmpty.notify_all();
}

int TaskQueue::pop(){
    unique_lock<mutex> ul(_mutex);
    while(empty()){
        _notEmpty.wait(ul);
    }
    int num = _que.front();
    _que.pop();

    _notFull.notify_all();
    return num;
}

bool TaskQueue::full() const{
    return _que.size() == _capacity;
}

bool TaskQueue::empty() const{
    return 0 == _que.size();
}

